在上一篇講完CRUD的Create
再來寫Read
class BooksController < ApplicationController
def index
@books = Book.all
end
end
index的實體變數有個慣例,後面都會加s變複數。
Book.all是透過Book這個model從資料庫的table裡撈東西,all會把所有table的東西撈出來。
不過其實.all不寫也沒差,直接寫@book = Book的效果也是一樣。
如果想把出來的順序倒著列出來,可以這樣寫:
class BooksController < ApplicationController
def index
@books = Book.order(id: :desc)
end
end
再來寫index的view:
<h1>Hello World!!</h1>
<%= link_to "新增",new_book_path %>
<% @books.each do |book|%>
<%= link_to book.title, book_path(book) %>
<% end%>
這裡用迴圈的方式把@books內的資料通通跑出來,在這邊有一點要注意,<% @books.each do |book|%>
在這行code寫的是<% %>,而不是<%= %>,寫<%= %>在頁面會印出來,<% %>不會。所以如果寫<%= @books.each do |book|%>
會把所有的資料都印出來喔。
<%= link_to book.title, book_path %>
這行會把所有的title列出來,title本身是超連結,會連到show去。
book_path(book)
book_path後面加一個(book)是因為我們需要找到路徑的:id
當Perfix與參數都一樣是book的時候,可以這樣寫:
<% @books.each do |book|%>
<%= link_to book.title, book %>
<% end%>
這樣寫的效果跟寫book_path(book)一樣。
寫到這裡,相信大家都知道下一步要寫什麼了吧。
沒錯就是show的action
class BooksController < ApplicationController
def show
@book = Book.find(params[:id])
end
end
我現在要透過model從資料庫拿資料,我要怎麼去篩選我要的東西?
這裡介紹三種常用的方法,find、find_by、where
find:
Book.find(id)
find方法只能找id,如果寫Book.find(3),那就會去找id: 3的資料。find有個優點,只要他找不到就會回報錯誤。
find_by:
Book.find_by(title: "cat")
find_by可以找{key: value},比find的條件相對自由,會取找符合條件的第一筆資料。但是如果找不到資料,find_by會回傳nil。
where:Book.where(title: "cat")
where的用法與find_by差不多,但不同的是,find_by只會找第一筆資料,而where會把所有符合條件的資料都找出來。
params[:id]
是什麼呢?在我們建立model的時候會有個默認的隱藏欄位id用來記錄流水編號。
在終端機輸入rails routes
會發現edit/show/update/destroy這四個路徑都會有:id,也就是他們需要找到這個id。
而這筆id的資料會被params包起來,用類似hash的寫法。因此我們只需要寫params[:id]
就能抓到這個id。
controller寫完後接著寫view,建立show.html.erb
<h1>標題:<%= @book.title %></h1>
<p>內容:<%= @book.content %></p>
<span>價格:<%= @book.price %></span>